# -*- coding: utf-8 -*-
"""
乒乓球培训管理系统 - 权限装饰器

提供各种角色权限检查的装饰器
确保用户只能访问自己权限范围内的功能
"""

from functools import wraps
from flask import abort, flash, redirect, url_for
from flask_login import current_user


def super_admin_required(f):
    """
    超级管理员权限装饰器

    只有超级管理员才能访问的功能
    """
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not current_user.is_authenticated or not current_user.is_super_admin():
            flash('您没有权限访问此功能', 'error')
            return redirect(url_for('dashboard.index'))
        return f(*args, **kwargs)
    return decorated_function


def campus_admin_required(f):
    """
    校区管理员权限装饰器

    只有校区管理员才能访问的功能
    """
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not current_user.is_authenticated or not current_user.is_campus_admin():
            flash('您没有权限访问此功能', 'error')
            return redirect(url_for('dashboard.index'))
        return f(*args, **kwargs)
    return decorated_function


def admin_required(f):
    """
    管理员权限装饰器

    超级管理员或校区管理员都可以访问
    """
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not current_user.is_authenticated or not (current_user.is_super_admin() or current_user.is_campus_admin()):
            flash('您没有权限访问此功能', 'error')
            return redirect(url_for('dashboard.index'))
        return f(*args, **kwargs)
    return decorated_function


def coach_required(f):
    """
    教练权限装饰器

    只有教练才能访问的功能
    """
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not current_user.is_authenticated or not current_user.is_coach():
            flash('您没有权限访问此功能', 'error')
            return redirect(url_for('dashboard.index'))
        return f(*args, **kwargs)
    return decorated_function


def student_required(f):
    """
    学员权限装饰器

    只有学员才能访问的功能
    """
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not current_user.is_authenticated or not current_user.is_student():
            flash('您没有权限访问此功能', 'error')
            return redirect(url_for('dashboard.index'))
        return f(*args, **kwargs)
    return decorated_function


def campus_access_required(f):
    """
    校区访问权限装饰器

    检查用户是否有权限访问指定校区的功能
    适用于校区管理员只能管理自己校区的情况
    """
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not current_user.is_authenticated:
            flash('请先登录', 'error')
            return redirect(url_for('auth.login'))

        # 超级管理员可以访问所有校区
        if current_user.is_super_admin():
            return f(*args, **kwargs)

        # 校区管理员只能访问自己的校区
        if current_user.is_campus_admin() and current_user.campus_id:
            return f(*args, **kwargs)

        # 教练和学员只能访问自己校区的功能
        if (current_user.is_coach() or current_user.is_student()) and current_user.campus_id:
            return f(*args, **kwargs)

        flash('您没有权限访问此功能', 'error')
        return redirect(url_for('dashboard.index'))
    return decorated_function


def role_required(*roles):
    """
    多角色权限装饰器

    允许指定多个角色访问的功能

    Args:
        *roles: 允许的角色列表，如 'super_admin', 'campus_admin', 'coach', 'student'
    """
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            if not current_user.is_authenticated:
                flash('请先登录', 'error')
                return redirect(url_for('auth.login'))

            user_roles = []
            if current_user.is_super_admin():
                user_roles.append('super_admin')
            if current_user.is_campus_admin():
                user_roles.append('campus_admin')
            if current_user.is_coach():
                user_roles.append('coach')
            if current_user.is_student():
                user_roles.append('student')

            # 检查用户是否具有任一允许的角色
            if any(role in user_roles for role in roles):
                return f(*args, **kwargs)

            flash('您没有权限访问此功能', 'error')
            return redirect(url_for('dashboard.index'))
        return decorated_function
    return decorator


def active_user_required(f):
    """
    活跃用户装饰器

    确保用户账户状态为活跃
    """
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not current_user.is_authenticated:
            flash('请先登录', 'error')
            return redirect(url_for('auth.login'))

        if current_user.status != 'active':
            flash('您的账户已被停用，请联系管理员', 'error')
            return redirect(url_for('auth.login'))

        return f(*args, **kwargs)
    return decorated_function


def same_campus_required(f):
    """
    同校区访问装饰器

    确保用户只能访问同校区的数据
    主要用于教练和学员访问控制
    """
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if not current_user.is_authenticated:
            flash('请先登录', 'error')
            return redirect(url_for('auth.login'))

        # 超级管理员可以访问所有校区
        if current_user.is_super_admin():
            return f(*args, **kwargs)

        # 其他角色需要有明确的校区归属
        if not current_user.campus_id:
            flash('您还没有分配到任何校区', 'error')
            return redirect(url_for('dashboard.index'))

        return f(*args, **kwargs)
    return decorated_function